#include <iostream>
#include <cstring>
#include <cstdlib>

//类:
// 封装特性
// 访问权限:public:公共权限——所有地方都可以访问
//        private:私有权限——只在本类内可以访问
//        protected:保护权限——只能在本类和本类的派生类中使用

// 类封装的一般习惯
// 1、属性对外访问关闭
// 2、方法对外开放

class student
{
public:
    //无参构造函数
    student()
    {
        std::cout<<"调用无参构造函数"<<std::endl;
    }
    //带参构造函数
    student(int id,const char* name)
    {
        std::cout<<"调用带参构造函数"<<std::endl;
        m_id = id;
        strcpy(m_name,name);
    }
    //拷贝构造函数:参数不能是类的对象,得是引用——如果参数是类的对象,会导致一直调用拷贝函数
    student(student& a)
    {
        std::cout<<"调用拷贝构造函数"<<std::endl;
        m_id = a.m_id;
        strcpy(m_name,a.m_name);
    }
    void show()
    {
        std::cout<<"学生学号:"<<m_id<<" 学生姓名:"<<m_name<<std::endl;
    }

    //析构函数
    ~student()
    {
        std::cout<<"调用析构函数"<<std::endl;
    }

    //成员方法
    void SetID(int id);
    int GetID();
    //函数的类内声明
    void SetName(const char *name);
    char *GetName();
private:
    //变量:属性
    //私有属性
    int m_id;
    char m_name[32];
};

void student::SetID(int id)
{
    m_id = id;
}

int student::GetID()
{
    return m_id;
}

// 函数的类外定义
void student::SetName(const char *name)
{
    strcpy(m_name,name);
}

char *student::GetName()
{
    return m_name;
}

int main()
{
    // student s(1,"张三");
    // student s2;
    // // s.SetID(10);
    // // s.SetName("张三");
    // std::cout<<"学生ID:"<<s.GetID()<<" 学生姓名:"<<s.GetName()<<std::endl;


    // student s(1,"张三");
    // // student s2(s);
    // student s2 = s;

    // student *s = (student*)malloc(sizeof(student));
    student *s = new student;
    
    // free(s);
    delete s;
    return 0;
}